package cn.dlc.com.order.service.listener;

import cn.dlc.com.common.entity.Order;
import cn.dlc.com.common.entity.TxLog;
import cn.dlc.com.order.service.OrderService;
import cn.dlc.com.txlog.dao.TxLogDao;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Service;

/**
 * @author 邓立川
 * @date 2021/1/10 16:51
 * @desc 半事务消息处理类
 */
@Slf4j
@Service
// 注意这个名字和半事务消息指定的一样
@RocketMQTransactionListener(txProducerGroup = "tx_producer_group")
public class OrderServiceImplListener implements RocketMQLocalTransactionListener {

    @Autowired
    private OrderService orderService;

    @Autowired
    private TxLogDao txLogDao;

    // 执行本地事务
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message message, Object o) {

        try {
            // 获取到要保存的参数
            Order order = (Order) o;
            //  拿到这个id
            String txId =(String) message.getHeaders().get("txId");
            System.out.println("order.getOrderName(): " + order.getOrderName());
            // 执行本地事务(将这个标志的id传递过去。)
            orderService.createOrderReal(order,txId);
            // 正常提交，同时会给服务器发送消息
            return RocketMQLocalTransactionState.COMMIT;
        }catch (Exception e) {
            log.error("异常本地事务执行异常",e);
            return RocketMQLocalTransactionState.ROLLBACK;
        }
    }

    // 消息回查
    @Override
    public RocketMQLocalTransactionState checkLocalTransaction(Message message) {
        // 获取到标志，通过这个标志来判断是不是本地事务执行成功
        String txId = (String) message.getHeaders().get("txId");
        TxLog txLog = txLogDao.findById(txId).get();
        if(txLog != null) {
            // 事务成功
            return RocketMQLocalTransactionState.COMMIT;
        } else {
            // 本地事务失败，
            return RocketMQLocalTransactionState.ROLLBACK;
        }
    }
}
